<?php
namespace app\admin\controller;


use app\extra\DBCont;
use think\Db;

/**
 * @title 投票详情
 * @description 接口说明
 * @group 后台投票管理
 * @header name:authorization require:1 default: desc:登陆的token
 */
class Player extends Base
{
    protected $_order = 'id desc';

    /**
     * @title 一条数据或选手列表
     * @description 接口说明     
     * @author hardy
     * @url /admin/Player
     * @method GET
     *
     * @param name:id type:int require:0 default:1 other: desc:唯一ID，获取某条记录详情，则为必填，id和page、vote_id选填其一
     * @param name:vote_id type:int require:0 default:1 other: desc:唯一ID，获取某条记录详情，则为必填，id和page、vote_id选填其一
     * @param name:page type:int require:0 default:1 other: desc:页码数 获取第二页以上的数据必填，默认值为1，id和page选填其一
     * @param name:size type:int require:0 default:20 other: desc:每一页的数量，默认20
     * @param name:title type:string require: default: other: desc:分页搜索可选条件，广告名称
     * @param name:publish type:int require: default: other: desc:分页搜索可选条件，发布状态：未发布，展示中，已下架
     *
     * @return number:参赛编号
     * @return vote_id:投票活动
     * @return title:选手名称
     * @return works:作品名称
     * @return cover:封面
     * @return desc:选手详情
     * @return init_vote:初始票数
     * @return vote_type:投票类型：单选投票、必选投票、多选投票
     * @return vote_limit:投票限制
     * @return votes:总票数
     *
     * @return list:消息列表,有page参数则返回值list，list是一个数组，
     * @return size:每页最大数，默认20，可由前端传递参数决定 page参数返回值，
     * @return page:当前页，page参数返回值，
     * @return count:总记录数， page参数返回值，
     */
    public function gets()
    {
        parent::gets();
    }
    protected function _searchPage(&$where)
    {
        $data = input('get.');
        if (empty($data['vote_id'])){
            $this->responseFail('投票活动id必填');
        }
        $where[] = ['vote_id','=', $data['vote_id']];
        $key = 'title';
        if(!empty($data[$key])){
            $where[] = [$key,'like', "%{$data[$key]}%"];
        }
    }

    /**
     * @title 投票详情-添加选手
     * @description 用户登录
     * @author hardy
     * @url /admin/Player
     * @method POST
     * @param name:number type:string require:1 default: other: desc:参赛编号
     * @param name:vote_id type:date require:1 default: other: desc:投票活动id
     * @param name:title type:int require:1 default: other: desc:选手名称
     * @param name:works type:string require:1 default:必选投票 other: desc:作品名称
     * @param name:cover type:int require:1 default: other: desc:封面
     * @param name:desc type:string require:1 default:固定次数 other: desc:选手详情
     * @param name:init_vote type:int require:1 default: other: desc:初始票数
     *
     * @return number:参赛编号
     * @return vote_id:投票活动
     * @return title:选手名称
     * @return works:作品名称
     * @return cover:封面
     * @return desc:选手详情
     * @return init_vote:初始票数
     * @return vote_type:投票类型：单选投票、必选投票、多选投票
     * @return vote_limit:投票限制
     * @return votes:总票数
     * @return page_view:真实访问量
     *
     * @return list:消息列表,有page参数则返回值list，list是一个数组，
     * @return size:每页最大数，默认20，可由前端传递参数决定 page参数返回值，
     * @return page:当前页，page参数返回值，
     * @return count:总记录数， page参数返回值，
     */
    public function create(){
        parent::create();
    }
    /**
     * @title 投票详情-编辑选手
     * @description 修改密码
     * @author hardy
     * @url /admin/Player
     * @method put
     *
     * @param name:id type:int require:1 default: other: desc:投票名称
     * @param name:number type:string require:0 default: other: desc:参赛编号
     * @param name:vote_id type:date require:0 default: other: desc:投票活动id
     * @param name:title type:int require:0 default: other: desc:选手名称
     * @param name:works type:string require:0 default:必选投票 other: desc:作品名称
     * @param name:cover type:int require:0 default: other: desc:封面
     * @param name:desc type:string require:0 default:固定次数 other: desc:选手详情
     * @param name:init_vote type:int require:0 default: other: desc:初始票数
     *
     * @return number:参赛编号
     * @return vote_id:投票活动
     * @return title:选手名称
     * @return works:作品名称
     * @return cover:封面
     * @return desc:选手详情
     * @return init_vote:初始票数
     * @return vote_type:投票类型：单选投票、必选投票、多选投票
     * @return vote_limit:投票限制
     * @return votes:总票数
     * @return page_view:真实访问量
     *
     */
    public function update(){
        parent::update();
    }
    /**
     * @title 投票详情-删除
     * @description 删除
     * @author hardy
     * @url /admin/Player
     * @method delete
     *
     * @param name:id type:int|string|array require:1 default: other: desc:单个删除：数字，多组删除：","隔开的数字或者数组
     */
    public function delete(){
        parent::delete();
    }
    /**
     * @title 赛事导入
     * @description 赛事导入
     * @author hardy
     * @url /admin/Player/importTeam
     * @method POST
     * @param name:vote_id type:string require:1 default: other: desc:投票信息id
     * @param name:team_id type:int|array require:1 default: other: desc:团队id
     *
     */
    public function importTeam(){
        $vote_id = input('post.vote_id');
        $this->isEmptyResponseFail($vote_id, '投票信息id必填');
        $team_id = input('post.team_id');
        $this->isEmptyResponseFail($team_id, '团队id必填');
        if (!is_array($team_id)){
            $team_id = [$team_id];
        }
        $max = Db::name('Player')->where('vote_id', $vote_id)->max('number');
        Db::startTrans();
        try {
            foreach ($team_id as $team){
                $this->addPlayer($vote_id,$team, ++$max);
            }
            Db::commit();
            $this->responseSuccess();
        } catch (\Exception $e){
            Db::rollback();
            $this->responseFail($e->getMessage());
        }
    }

    /**
     * 新增选手
     * @param $vote_id
     * @param $team_id
     * @param $max
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    private function addPlayer($vote_id, $team_id, $max){
        $data = Db('Team')->where('id', $team_id)->where(DBCont::DELETE_FIELD, '=', null)->find();
        $save = [
            'number' => $max,
            'vote_id' => $vote_id,
            'title' => $data['title'],
            'works' => $data['title'],
            'cover' => $data['cover'],
            'desc' => $data['desc'],
            'init_vote' => 0,
            'status' => 1,
        ];
        $model = model('Player');
        $r = $model->createAdd($save);
        if ($r === false){
            \exception($model->getError());
        }
    }
    /**
     * @title 选手统计
     * @description 修改密码
     * @author hardy
     * @url /admin/Player/statistics
     * @method get
     *
     * @param name:id type:int require:1 default: other: desc:选手id
     * @param name:time type:string require:0 default: other: desc:时间格式，一周最后一天
     * @return vote:7天内投票统计，是一个数组,其中包含date(天)和number（数量）
     * @return visit:7天内访问量的统计，是一个数组,其中包含date(天)和number（数量）
     * @return vote_day:今天的投票量
     * @return count_vote:总投票
     * @return visit_day:今天的访问量
     * @return visit_count:总访问量
     */
    public function statistics(){
        // 按天统计访问量
        $id = input('get.id');
        if (empty($id)){
            $this->responseFail('id必须');
        }
        // 取得开始和结束时间
        $time = input('get.time', date('Y-m-d'));
        $now = strtotime($time);
        $start = $now - 7 * 24 *3600;

        // 一周的投票量
        $voteDate = model('VotePlayer')->statisticsPlayer($id, $start, $now);
        $data['vote'] = $this->timeSectionData($voteDate, $start, $now);
        // 一周的访问量
        $voteDate = model('Visit')->statisticsPlayer($id, $start, $now);
        $data['visit'] = $this->timeSectionData($voteDate, $start, $now);
        

        // 今天的票
        $day = strtotime(date('Y-m-d'));
        $data['vote_day'] = model('VotePlayer')->where('player_id', $id)->where('vote_time', '=', $day)->count();
        // 投票总量
        $data['count_vote'] = model('VotePlayer')->where('player_id', $id)->count();
        // 访问量
        $data['visit_count'] = model('Visit')->where('player_id', $id)->count();
        // 今天访问量
        $data['visit_day'] = model('Visit')->where('player_id', $id)->where('vote_time', '=', $day)->count();
        
        $this->responseSuccess($data);
    }

    /**
     * 补全值
     * @param $data
     * @param $startTime
     * @param $endTime
     * @return array
     */
    private function timeSectionData($data, $startTime, $endTime){
        $date = [];
        for($i = $startTime; $i <= $endTime; $i += 24 * 3600){
            $num = 0;
            foreach ($data as $item){
                if ($item['key'] == $i){
                    $num = $item['number'];
                }
            }
            $tem = [
                'date' => date('Y-m-d', $i),
                'number' =>$num
            ];
            $date[] = $tem;
        }
        return $date;
    }
    

}